<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算属性之get和set</title>
</head>

<body>
    <div id="app">
        姓：<input type="text" placeholder="First Name" v-model="firstName"><br>
        名：<input type="text" placeholder="Last Name" v-model="lastName"><br>
        姓名1（单向）：<input type="text" placeholder="Full Name1" v-model="fullName1"><br>
        姓名2（单向）：<input type="text" placeholder="Full Name2" v-model="fullName2"><br>
        姓名3（双向）：<input type="text" placeholder="Full Name3" v-model="fullName3">
    </div>
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                firstName: 'A',
                lastName: 'B',
                fullName2: 'A B'
            },
            //计算属性  有缓存
            computed: {
                //什么时候执行：初始化显示/相关的data数据属性发生改变也执行
                fullName1() { //计算属性中的一个方法，方法的返回值作为属性值来显示
                    return this.firstName + ' ' + this.lastName
                },
                fullName3: {
                    //回调函数 计算并返回当前属性的值
                    get() {
                        return this.firstName + ' ' + this.lastName;
                    },
                    //当属性值发生改变时回调，更新相关的属性数据  监视当前属性值的变化
                    set(value) {
                        const names = value.split(' ');
                        this.firstName = names[0];
                        this.lastName = names[1];
                    }
                }
            },
            //监视
            watch: { //配置监视
                firstName: function (newValue, oldValue) { //函数调用说明firstName发生了改变
                    //console.log(this);//Vue的实例
                    this.fullName2 = newValue + ' ' + this.lastName;
                }
            }
        })
        vm.$watch('lastName', function (newValue) {
            //更新fullName2
            this.fullName2 = this.firstName + ' ' + newValue;
        })
    </script>
</body>

</html>